/**
主要回顾：强制类型转换

基本数据类型转换：
    小数据类型---->大数据类型：自动类型转换
    大数据类型---->小数据类型：强制类型转换
        小数据类型 变量名 = (小数据类型) 大数据类型变量;
        
引用数据类型转换：
    小数据类型---->大数据类型：自动类型转换
    大数据类型---->小数据类型：强制类型转换
        小数据类型 变量名 = (小数据类型) 大数据类型变量;
        具体类型 变量名 = (具体类型) 抽象类型变量;


*/

abstract class Animal{
    String name;
    String color;
    
    public Animal(String name, String color){
        this.name = name;
        this.color = color;
    }
    
    public abstract void run();
    
    public void eat(){
        System.out.println("eating...");
    }
}

class Dog extends Animal{
    public Dog(String name, String color){
        super(name, color);
    }
    
    public void run(){
        System.out.println(name + " running...");
    }
    
    public void bite(){
        System.out.println("biting...");
    }
}

class Fish extends Animal{
    public Fish(String name, String color){
        super(name, color);
    }
    
    public void run(){
        System.out.println(name + " swimming...");
    }
    
    public void bubble(){
        System.out.println("bubbling...");
    }
}

class LearnTypeConversion {
    public static void main(String[] args) {
        Animal a = new Dog("husky", "white");
//        a.bite();    //报错：找不到符号——不能调用子对象的特有方法
        
        //强制类型转换
        Dog d = (Dog) a;
        d.bite();    //可以调用
        
//        Fish f = (Fish) a;    //报错：类型不匹配——java.lang.ClassCastException
        
        Animal f = new Fish("fishfish", "golden");
        print(f);
    }
    
    //传入抽象父对象并调用具体子对象的特有方法
    public static void print(Animal a){
        if (a instanceof Fish) {    //instanceof 关键字的应用
            Fish f = (Fish) a;
            f.bubble();
        } else if (a instanceof Dog) {
            Dog d = (Dog) a;
            d.bite();
        }
    }
}